package org.ricks.net.action.utils;

public class CmdKit {

    /**
     * 合并两个参数,分别存放在 [高16 和 低16]
     * <pre>
     *     moduleId - 高16
     *     subCmd - 低16
     *     例如 moduleId = 1; serverId = 1;
     *     mergeConv 的结果: 65537
     *     那么 mergeConv 对应的二进制是: [0000 0000 0000 0001] [0000 0000 0000 0001]
     * </pre>
     *
     * @param cmd  模块ID由存放于合并结果的高16位, 该参数不得大于 32767
     * @param subCmd  消息指令存放于合并结果的低16位, 该参数不得大于 65535
     * @return 合并的结果
     */
    public static int merge(short cmd, int subCmd) {
        return (cmd << 16) + subCmd;
    }


    /**
     * 得到请求模块
     * 从 mergeId 中获取 [高16位] 的数值
     *
     * @param merge 合并路由 mergeId
     * @return [高16位] 的数值
     */
    public static int modularId(int merge) {
        return merge >> 16;
    }

    /**
     * 得到消息包ID
     * 从 merge 中获取 [低8位] 的数值
     *
     * @return [低8位] 的数值
     */
    public static int subCmd(int merge) {
        return merge & 0xFFFF;
    }

    public static void main(String[] args) {
        test((short) 1,(short) 1);
        test((short) 1,(short) 2);

        test((short) 2,(short) 2);

        test((short) 12223,(short) 99);

        test((short) 233,(short) 41);
    }

    public static void test(short packageId,short mid) {
        int merge = merge(packageId,mid);
        System.err.println(merge + " & " +  modularId(merge) + " & " + subCmd(merge));
    }
}
